package br.senai.sc.web.corpoHidrico.beans;

import java.io.Serializable;
import java.util.List;

import javax.faces.bean.ViewScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.inject.Inject;
import javax.inject.Named;

import org.jboss.seam.international.status.Messages;
import org.jboss.seam.international.status.builder.BundleKey;

import br.senai.sc.controller.business.BaciaHidrograficaBusiness;
import br.senai.sc.controller.crud.BaciaHidrograficaCRUD;
import br.senai.sc.controller.crud.CidadeCRUD;
import br.senai.sc.controller.crud.CorpoHidricoCRUD;
import br.senai.sc.controller.exception.BusinessException;
import br.senai.sc.model.BaciaHidrografica;
import br.senai.sc.model.Cidade;
import br.senai.sc.model.CorpoHidrico;
import br.senai.sc.util.SystemConstants;

/**
 * @author Tiago
 */
@Named
@ViewScoped
public class CorpoHidricoBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private List<Cidade> cidades;

    private CorpoHidrico corpoHidrico;

    private DataModel<CorpoHidrico> corposHidricos;

    @Inject
    private BaciaHidrograficaCRUD baciaHidrograficaCRUD;

    @Inject
    private CorpoHidricoCRUD corpoHidricoCRUD;

    private List<BaciaHidrografica> bacias;

    @Inject
    private Messages messages;

    @Inject
    private CidadeCRUD cidadeCRUD;

    @Inject
    private BaciaHidrograficaBusiness baciaHidrograficaBusiness;

    public List<Cidade> getCidades() {

        if (cidades == null) {
            cidades = cidadeCRUD.findCidades();
        }

        return cidades;
    }

    public void setCidades(List<Cidade> cidades) {
        this.cidades = cidades;
    }

    public List<BaciaHidrografica> getBacias() {

        if (bacias == null) {
            bacias = baciaHidrograficaCRUD.findBaciasHidrograficas();
        }

        return bacias;
    }

    public void setBacias(List<BaciaHidrografica> bacias) {
        this.bacias = bacias;
    }

    public CorpoHidrico getCorpoHidrico() {
        return corpoHidrico;
    }

    public void setCorpoHidrico(CorpoHidrico corpoHidrico) {
        this.corpoHidrico = corpoHidrico;
    }

    public boolean existeBaciaHidrograficaCadastrada() {
        return baciaHidrograficaBusiness.existeBaciaHidrograficaCadastrada();
    }

    public void carregarCidadesDaBacia() {

        if (corpoHidrico.getBaciaHidrografica() != null) {
            BaciaHidrografica bacia = baciaHidrograficaCRUD.findBaciaHidrografica(corpoHidrico.getBaciaHidrografica().getIdBaciaHidrografica());
            // TODO Action plan: Fix para LazyInitializationException
            bacia.getCidades().size();
            corpoHidrico.setBaciaHidrografica(bacia);

        }
    }

    public DataModel<CorpoHidrico> getCorposHidricos() {

        if (corposHidricos == null) {
            corposHidricos = new ListDataModel<CorpoHidrico>(corpoHidricoCRUD.findCorposHidricos());
        }

        return corposHidricos;
    }

    public void setCorposHidricos(DataModel<CorpoHidrico> corposHidricos) {
        this.corposHidricos = corposHidricos;
    }

    /**
     * Acionado quando o usuário deseja cadastrar um novo corpo hidrico.
     */
    public void cadastrarCorpoHidrico() {
        corpoHidrico = new CorpoHidrico();
    }

    public void carregarCorpoHidrico() {
        corpoHidrico = corpoHidricoCRUD.findCorpoHidrico(corposHidricos.getRowData().getIdCorpoHidrico());
        // TODO Action plan: Fix para LazyInitializationException
        corpoHidrico.getCidades().size();
    }

    public void salvarCorpoHidrico() {

        try {
            corposHidricos = null;
            corpoHidrico = corpoHidricoCRUD.salvar(corpoHidrico);
            messages.info(new BundleKey(SystemConstants.PATH_TO_APPLICATION_MESSAGES, "corposHidricos.cadastrar.sucesso"));
        } catch (BusinessException e) {}
    }

    public void removerCorpoHidrico() {

        try {
            corpoHidricoCRUD.remover(corpoHidrico);
            corpoHidrico = null;
            corposHidricos = null;
            messages.info(new BundleKey(SystemConstants.PATH_TO_APPLICATION_MESSAGES, "corposHidricos.remover.sucesso"));
        } catch (BusinessException e) {}
    }

}
